.TH std::list::unique 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::list::unique \- std::list::unique

.SH Synopsis
   void unique();                                 \fI(until C++20)\fP
   size_type unique();                            \fI(since C++20)\fP
   template< class BinaryPredicate >      \fB(1)\fP                   \fI(until C++20)\fP
   void unique( BinaryPredicate p );          \fB(2)\fP
   template< class BinaryPredicate >                            \fI(since C++20)\fP
   size_type unique( BinaryPredicate p );

   Removes all consecutive duplicate elements from the container. Only the first
   element in each group of equal elements is left. Invalidates only the iterators and
   references to the removed elements.

   1) Uses operator== to compare the elements.
   2) Uses p to compare the elements.

   The behavior is undefined if the corresponding comparator does not establish an
   equivalence relation.

.SH Parameters

       binary predicate which returns true if the elements should be treated as equal.

       The signature of the predicate function should be equivalent to the following:

        bool pred(const Type1 &a, const Type2 &b);

       While the signature does not need to have const &, the function must not modify
   p - the objects passed to it and must be able to accept all values of type (possibly
       const) Type1 and Type2 regardless of value category (thus, Type1 & is not
       allowed
       , nor is Type1 unless for Type1 a move is equivalent to a copy
       \fI(since C++11)\fP).
       The types Type1 and Type2 must be such that an object of type
       list<T,Allocator>::const_iterator can be dereferenced and then implicitly
       converted to both of them.
.SH Type requirements
   -
   BinaryPredicate must meet the requirements of BinaryPredicate.

.SH Return value

   \fI(none)\fP                          \fI(until C++20)\fP
   The number of elements removed. \fI(since C++20)\fP

.SH Complexity

   If empty() is true, no comparison is performed.

   Otherwise, given \\(\\scriptsize N\\)N as std::distance(begin(), end()):

   1) Exactly \\(\\scriptsize N-1\\)N-1 comparisons using operator==.
   2) Exactly \\(\\scriptsize N-1\\)N-1 applications of the predicate p.

.SH Notes

          Feature-test macro          Value    Std          Feature
   __cpp_lib_list_remove_return_type 201806L (C++20) Change the return type

.SH Example


// Run this code

 #include <iostream>
 #include <list>

 std::ostream& operator<< (std::ostream& os, std::list<int> const& container)
 {
     for (int val : container)
         os << val << ' ';
     return os << '\\n';
 }

 int main()
 {
     std::list<int> c{1, 2, 2, 3, 3, 2, 1, 1, 2};
     std::cout << "Before unique(): " << c;
     const auto count1 = c.unique();
     std::cout << "After unique():  " << c
               << count1 << " elements were removed\\n";

     c = {1, 2, 12, 23, 3, 2, 51, 1, 2, 2};
     std::cout << "\\nBefore unique(pred): " << c;

     const auto count2 = c.unique([mod = 10](int x, int y)
     {
         return (x % mod) == (y % mod);
     });

     std::cout << "After unique(pred):  " << c
               << count2 << " elements were removed\\n";
 }

.SH Output:

 Before unique(): 1 2 2 3 3 2 1 1 2
 After unique():  1 2 3 2 1 2
 3 elements were removed

 Before unique(pred): 1 2 12 23 3 2 51 1 2 2
 After unique(pred):  1 2 23 2 51 2
 4 elements were removed

  Defect reports

   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.

      DR    Applied to       Behavior as published              Correct behavior
                       it was unclear whether iterators  only invalidates iterators and
   LWG 1207 C++98      and/or references will be         references to the removed
                       invalidated                       elements

.SH See also

   unique removes consecutive duplicate elements in a range
          \fI(function template)\fP
